using MediatR;
using S.O.Api.Write.Application.Command.Permission;
using S.O.Domain.RBAC;
using S.O.ErrorCode;
using S.O.Interstructrue.Base;

namespace S.O.Api.Write.Application.Handler.Permission
{
    /// <summary>
    /// 删除权限处理器
    /// 负责处理权限删除的业务逻辑，采用软删除方式
    /// </summary>
    public class DeletePermissionHandler : IRequestHandler<DeletePermissionCommand, APIResult<int>>
    {
        /// <summary>
        /// 权限仓储接口，用于权限数据的CRUD操作
        /// </summary>
        private readonly IBaseRepository<PermissionModel> _permissionRepository;

        /// <summary>
        /// 日志记录器，用于记录操作日志和错误信息
        /// </summary>
        private readonly ILogger<DeletePermissionHandler> _logger;

        /// <summary>
        /// 构造函数，通过依赖注入初始化所需的服务
        /// </summary>
        /// <param name="permissionRepository">权限仓储服务</param>
        /// <param name="logger">日志记录服务</param>
        public DeletePermissionHandler(IBaseRepository<PermissionModel> permissionRepository, ILogger<DeletePermissionHandler> logger)
        {
            _permissionRepository = permissionRepository;
            _logger = logger;
        }
        
        /// <summary>
        /// 处理删除权限命令
        /// 执行权限软删除操作（标记为已删除，不从数据库中物理删除）
        /// </summary>
        /// <param name="request">删除权限命令对象，包含要删除的权限ID</param>
        /// <param name="cancellationToken">取消令牌，用于取消异步操作</param>
        /// <returns>返回包含操作结果的APIResult对象</returns>
        public Task<APIResult<int>> Handle(DeletePermissionCommand request, CancellationToken cancellationToken)
        {
            // 初始化返回结果对象
            APIResult<int> res = new APIResult<int>();
            
            // 根据权限ID获取要删除的权限信息
            var permission = _permissionRepository.GetModel(request.Id);
            
            // 执行权限软删除（标记为已删除，不从数据库中物理删除）
            if(permission != null)
                permission.IsDeleted = true;
            
            // 更新权限记录（执行软删除）
            var r = _permissionRepository.Update(permission);
            
            // 根据删除结果返回相应的响应
            if (r > 0)
            {
                res.Data = r;
                res.Code = APIEnums.Success;
                res.Msg = "删除成功";
                _logger.LogInformation($"权限ID:{request.Id}删除成功");
                return Task.FromResult(res);
            }
            else
            {
                res.Code = APIEnums.Fail;
                res.Msg = "删除失败";
                _logger.LogError($"权限ID:{request.Id}删除失败");
                return Task.FromResult(res);
            }
        }
    }
}
